package kr.co.bettersoft.pushchat.activity;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Date;

import kr.co.bettersoft.pushchat.common.CommonConstant;
import kr.co.bettersoft.pushchat.common.CommonUtil;
import kr.co.bettersoft.pushchat.common.PushChatRest;
import kr.co.bettersoft.pushchat.domain.PushChatBlock;
import kr.co.bettersoft.pushchat.domain.PushChatChat;
import kr.co.bettersoft.pushchat.domain.PushChatDiary;
import kr.co.bettersoft.pushchat.domain.PushChatFriend;
import kr.co.bettersoft.pushchat.domain.PushChatMember;
import kr.co.bettersoft.pushchat.domain.PushChatRecommendation;

import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.graphics.drawable.BitmapDrawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

/**
 * DiaryDetailActivity
 *  일기 상세 정보
 *    상단 타이틀 (일기 제목), 상단 좌측 닫기 버튼
 *    글쓴이명(아이디)
 *    좋아요 - 좋아요 누른 횟수. 좋아요 아이콘 눌러 의견 반영 가능. 1번만 가능. 취소 없음.
 *    이미지.
 *    내용
 *    글쓴 날짜
 * @author blue
 *
 */
public class DiaryDetailActivity extends Activity{
	String TAG = "DiaryDetailActivity";

	final int SELECT_DIARY_INFORMATION = 302;		// RestSelectDiaryInformation  // 일기 상세 정보	selectDiaryInformation
	final int SELECT_DUPLICATION_RECOMMENDATION = 303;		// RestSelectDuplicationFriend  // 일기 추천 전 중복 검사		selectDuplicationRecommendation
	final int REGISTER_RECOMMENDATION = 304;				// RestRegisterFriend	// 일기 추천		registerRecommendation
	final int REGISTER_BLOCK = 305;				// RestRegisterBlock	// 사용자 차단		registerBlock
	////	final int UPDATE_LOG_TO_SERVER = 302;

	// qr
	String userId;		// 사용자 아이디
	// 설정 파일 저장소  - 사용자 전번 읽기 / 쓰기 용도	
	SharedPreferences sharedPrefCustom;
	// 중복 실행 방지용
	int isUpdating = 0;
	/////////////////////////////////////////////////////////////////////////////

	TextView diary_detail_title ;	// 타이틀	
	Button topNaviCloseBtn; 		// 상단 닫기 버튼
	Button topNaviBlockBtn; 		// 상단 차단 버튼
	
	//	View memberInfoMasterView;		// 전체 - > 한번에 보여주기 위함


	Button like_up_btn;				// 추천 버튼
	ImageView diary_detail_image_view;		// 이미지
	TextView diary_detail_writer_info_txt;					// 작성자 닉네임 및 아이디
	TextView diary_detail_like_count_txt;					// 일기 추천수
	TextView diary_detail_content;					// 내용
	TextView diary_detail_register_date_txt;					// 등록일자

	//	Button diary_detail_like_up_btn;		// 추천 버튼

	// 진행바
	ProgressBar pb1;		// 중단 로딩 진행바

	// 서버 통신
	String certiResult="";
	PushChatRest pushChatRest;
//	String callResult = "";

	PushChatDiary pushChatDiary;		// 일기 정보

	String idPushChatDiary;		// 전달 받은 일기 고유번호		
	String writerId;			// 전달 받은 일기 작성자 아이디	

	/////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 핸들러
	Handler handler = new Handler(){
		@Override
		public void handleMessage(Message msg){
			try{
				Bundle b = msg.getData();		// 받아온결과를 화면에 뿌려준다.
				if(b.getInt("showYN")==1){
					// merchantData 에서 데이터 꺼내어 화면에 세팅한다.			// titleImg , name , companyName , phone , addr , pr ,,
					//					TextView name = (TextView)findViewById(R.id.name);	
					hidePb();
					diary_detail_title.setText(pushChatDiary.getSubject());
					diary_detail_writer_info_txt.setText(pushChatDiary.getNickName()+"("+pushChatDiary.getMemberId()+")");
					diary_detail_like_count_txt.setText(pushChatDiary.getLikeCount());
					diary_detail_content.setText(pushChatDiary.getContent());
					diary_detail_register_date_txt.setText(pushChatDiary.getRegisterDate());
					if(pushChatDiary.getFile()!=null){
						//  이미지 가져와서 붙임
						diary_detail_image_view.setImageBitmap(pushChatDiary.getFile());
					}else{
						diary_detail_image_view.setImageDrawable(getResources().getDrawable(R.drawable.empty_diary));
						diary_detail_image_view.setVisibility(View.GONE);
					}
					if(writerId.equals(userId)){
						topNaviBlockBtn.setVisibility(View.GONE);
					}
					
					//					memberInfoMasterView.setVisibility(View.VISIBLE);
				}


				//				if(b.getInt("updateFriendBtn")==1){
				//					// 친구 여부에 따라 친구 추가, 친구끊기 버튼을 보여준다. 자신과는 친구관계가 없다.
				//					if(memberId.equals(userId)){
				//						diary_detail_add_friend_btn.setVisibility(View.GONE);
				//						diary_detail_delete_friend_btn.setVisibility(View.GONE);
				//					}else{
				//						if(isMyFriend){		// 친구면 친구 끊기 버튼이 보임
				//							diary_detail_add_friend_btn.setVisibility(View.GONE);
				//							diary_detail_delete_friend_btn.setVisibility(View.VISIBLE);
				//						}else{				// 친구 아니면 친구 추가 버튼이 보임
				//							diary_detail_delete_friend_btn.setVisibility(View.GONE);
				//							diary_detail_add_friend_btn.setVisibility(View.VISIBLE);
				//						}
				//					}
				//				}
				if(b.getInt("confirmLikeUpDiary")==1){					 // 일기 추천 확인
					new AlertDialog.Builder(returnThis())
					.setTitle(CommonConstant.alertTitle)							
					.setMessage(b.getString("msg"))
					.setIcon(R.drawable.ic_dialog_img)		  
					.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int whichButton) {
							handler.sendEmptyMessage(SELECT_DUPLICATION_RECOMMENDATION);
						}})
						.setNegativeButton(android.R.string.no, null).show();
				}
//				}else if(b.getInt("confirmAddOrDeleteFriend")==2){					 // 친구 끊기 확인 
				//					new AlertDialog.Builder(returnThis())
				//					.setTitle(CommonConstant.alertTitle)							
				//					.setMessage(b.getString("msg"))
				//					.setIcon(R.drawable.ic_dialog_img)		 
				//					.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
				//						public void onClick(DialogInterface dialog, int whichButton) {
				//							handler.sendEmptyMessage(REST_UPDATE_DEACTIVE_FRIEND);
				//						}})
				//						.setNegativeButton(android.R.string.no, null).show();
				//				}
				
				if(b.getInt("confirmBlock")==1){					 // 사용자 차단 확인
					new AlertDialog.Builder(returnThis())
					.setTitle(CommonConstant.alertTitle)							
					.setMessage(b.getString("msg"))
					.setIcon(R.drawable.ic_dialog_img)		  
					.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int whichButton) {
							handler.sendEmptyMessage(REGISTER_BLOCK);
						}})
						.setNegativeButton(android.R.string.no, null).show();
				}
				
				if(b.getInt("showAlert")==1){					 // 알림 및 경고창 . 
					new AlertDialog.Builder(returnThis())
					.setTitle(CommonConstant.alertTitle)							
					.setMessage(b.getString("msg"))
					.setIcon(R.drawable.ic_dialog_img)		// 경고창.  
					.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int whichButton) {
							// 그냥 사용자 확인 용이기 때문에 추가 조작 없음.
						}})
						.setNegativeButton("", null).show();
				}

				if(b.getInt("order")==1){ 		// 프로그래스바 실행
					pb1.setVisibility(View.VISIBLE);
				}else if(b.getInt("order")==2){ // 프로그래스바  종료
					pb1.setVisibility(View.INVISIBLE);
				}
				if(b.getInt("showErrToast")==1){
					Toast.makeText(DiaryDetailActivity.this, R.string.error_message, Toast.LENGTH_SHORT).show();
				}

				switch (msg.what)
				{
				//					// 일기 상세 정보 가져오기	
				case SELECT_DIARY_INFORMATION   : runOnUiThread(new RunnableSelectDiaryInformation());				
				break;
				//					// 일기 추천 전 중복 검사
				case SELECT_DUPLICATION_RECOMMENDATION   : runOnUiThread(new RunnableSelectDuplicationRecommendation());						
				break;
				//					// 일기 추천
				case REGISTER_RECOMMENDATION   : runOnUiThread(new RunnableRegisterRecommendation());			
				break;
				case REGISTER_BLOCK   : runOnUiThread(new RunnableRegisterBlock());			
				break;
				default : 
					break;
				}	
			}catch(Exception e){
				e.printStackTrace();
			}
		}
	};

	//////////////////////////////////////////////////////////////////////////////////////////////////////////


	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature( Window.FEATURE_NO_TITLE );		// no title
		setContentView(R.layout.diary_detail_activity);

		pushChatRest = new PushChatRest();

		diary_detail_title = (TextView)findViewById(R.id.diary_detail_title);		// 타이틀

		//		memberInfoMasterView = (View)findViewById(R.id.member_info_master_view);		// 마스터 뷰

		diary_detail_image_view = (ImageView)findViewById(R.id.diary_detail_image_view);
		diary_detail_writer_info_txt = (TextView)findViewById(R.id.diary_detail_writer_info_txt);
		diary_detail_like_count_txt = (TextView)findViewById(R.id.diary_detail_like_count_txt);

		//		member_info_sex_txt = (TextView)findViewById(R.id.member_info_sex_txt);
		//		member_info_age_txt = (TextView)findViewById(R.id.member_info_age_txt);
		diary_detail_content = (TextView)findViewById(R.id.diary_detail_content);
		diary_detail_register_date_txt = (TextView)findViewById(R.id.reg_date_view);

		
		// 상단 닫기 버튼
		topNaviCloseBtn = (Button) findViewById(R.id.top_navi_close_btn);
		topNaviCloseBtn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				Log.d(TAG,"topNaviCloseBtn clicked");
				finish();
			}
		});
		// 상단 차단 버튼
		topNaviBlockBtn = (Button) findViewById(R.id.top_navi_block_btn);
		topNaviBlockBtn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				Log.d(TAG,"topNaviBlockBtn clicked");
				confirmBlock();
			}
		});
		
		like_up_btn = (Button) findViewById(R.id.like_up_btn);
		// 추천 버튼
		like_up_btn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				Log.d(TAG,"like_up_btn clicked");
				//				finish();		confirmAddFriend();
				confirmLikeUpDiary();
			}
		});

		// progress bar
		pb1 = (ProgressBar) findViewById(R.id.diary_detail_progressbar);		// 로딩(중앙)

		// prefs
		sharedPrefCustom = getSharedPreferences(CommonConstant.prefName,				
				Context.MODE_WORLD_READABLE | Context.MODE_WORLD_WRITEABLE);
		userId = sharedPrefCustom.getString("userId", "");	
		//		if(userId.length()<1){
		//			Log.d(TAG,"no saved userId");
		//			finish();
		//		}

		// *** 데이터 전달 받기
		Intent gottenIntent = getIntent();
		idPushChatDiary = gottenIntent.getStringExtra("idPushChatDiary");
		writerId = gottenIntent.getStringExtra("writerId");

		if(isUpdating==0){
			handler.sendEmptyMessage(SELECT_DIARY_INFORMATION);	// 일기 정보 가져오도록 한다
		}
	}

	//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

	////////////////////////////////////////////////////////////////////////////////////////////
	// 비동기 통신.

	/**
	 * 러너블. 일기 상세 정보 가져오기	
	 */
	class RunnableSelectDiaryInformation implements Runnable {
		public void run(){
			new backgroundSelectDiaryInformation().execute();
		}
	}
	/**
	 * 비동기로 일기 상세 정보 가져오기
	 * backgroundSelectDiaryInformation
	 */
	public class backgroundSelectDiaryInformation extends  AsyncTask<Void, Void, Void> { 
		@Override protected void onPostExecute(Void result) {  
		} 
		@Override protected void onPreExecute() {  
		} 
		@Override protected Void doInBackground(Void... params) {  
			Log.d(TAG,"backgroundSelectDiaryInformation");

			if(isUpdating==0){
				isUpdating = 1;
				// 파리미터 세팅
				PushChatDiary pushChatDiaryParam = new PushChatDiary();
				pushChatDiaryParam.setIdPushChatDiary(idPushChatDiary);
				// 호출
				showPb();
				String callResult = pushChatRest.RestSelectDiaryInformation(pushChatDiaryParam, returnThis());		
				// 결과 처리
				if(callResult.equals("F")){	
					showMSG();
				}else{														 
					Date tempDate = new Date();

					try {
						JSONObject jsonObject = new JSONObject(callResult);		// member
						//				callResult = "";
						pushChatDiary = new PushChatDiary();		// 일기 정보
						pushChatDiary.setIdPushChatDiary(jsonObject.getString("idPushChatDiary"));
						if(pushChatDiary.getIdPushChatDiary()==null || pushChatDiary.getIdPushChatDiary().length()<1){
							pushChatDiary.setIdPushChatDiary("");
							callResult = "F";
						}
						pushChatDiary.setMemberId(jsonObject.getString("memberId"));
						if(pushChatDiary.getMemberId()==null || pushChatDiary.getMemberId().length()<1){
							pushChatDiary.setMemberId("");
						}
						pushChatDiary.setNickName(jsonObject.getString("nickName"));
						if(pushChatDiary.getNickName()==null || pushChatDiary.getNickName().length()<1){
							pushChatDiary.setNickName("");
						}
						pushChatDiary.setCategory(jsonObject.getString("category"));
						if(pushChatDiary.getCategory()==null || pushChatDiary.getCategory().length()<1){
							pushChatDiary.setCategory("");
						}
						pushChatDiary.setSubject(jsonObject.getString("subject"));
						if(pushChatDiary.getSubject()==null || pushChatDiary.getSubject().length()<1){
							pushChatDiary.setSubject("");
						}
						pushChatDiary.setContent(jsonObject.getString("content"));
						if(pushChatDiary.getContent()==null || pushChatDiary.getContent().length()<1){
							pushChatDiary.setContent("");
						}
						pushChatDiary.setFileUrl(jsonObject.getString("fileUrl"));
						if(pushChatDiary.getFileUrl()==null || pushChatDiary.getFileUrl().length()<1){
							pushChatDiary.setFileUrl("");
						}else{
							try{
								Bitmap bmp = LoadImage(pushChatDiary.getFileUrl());
								pushChatDiary.setFile(bmp);
							}catch(Exception e){
								e.printStackTrace();
							}
						}

						pushChatDiary.setThumbnailUrl(jsonObject.getString("thumbnailUrl"));
						if(pushChatDiary.getThumbnailUrl()==null || pushChatDiary.getThumbnailUrl().length()<1){
							pushChatDiary.setThumbnailUrl("");
						}
						String tempRegisterDate = jsonObject.getString("registerDate");
						// 형변환 작업
						CommonUtil commonUtil = new CommonUtil();
						tempDate = commonUtil.sf.parse(tempRegisterDate);

						String year = getString(R.string.year);
						String month = getString(R.string.month);
						String day = getString(R.string.day);
						String hour = getString(R.string.hour);
						String minute = getString(R.string.minute);
						SimpleDateFormat sfGeneral = new SimpleDateFormat("yyyy"+year+" MM"+month+" dd"+day+" a hh"+hour+" mm"+minute);
						SimpleDateFormat sfGeneral2 = new SimpleDateFormat("yyyy"+year+" MM"+month+" dd"+day+" HH"+hour+" mm"+minute);
						SimpleDateFormat sfGeneralChat = new SimpleDateFormat("MM"+month+" dd"+day+" a hh"+hour+" mm"+minute);

						tempRegisterDate = sfGeneral.format(tempDate);
						pushChatDiary.setRegisterDate(tempRegisterDate);
						if(pushChatDiary.getRegisterDate()==null || pushChatDiary.getRegisterDate().length()<1){
							pushChatDiary.setRegisterDate("");
						}
						pushChatDiary.setLikeCount(jsonObject.getString("likeCount"));
						if(pushChatDiary.getLikeCount()==null || pushChatDiary.getLikeCount().length()<1){
							pushChatDiary.setLikeCount("");
						}
					} catch (Exception e) {
						callResult = "F";
					}

					//					if(pushChatDiary.getFileUrl().length()>0){
					//						//  이미지 가져와서 붙임
					//						try{
					//							Bitmap bmp = LoadImage(pushChatDiary.getFileUrl());
					//							pushChatDiary.setFile(bmp);
					//						}catch(Exception e){
					//							e.printStackTrace();
					//						}
					//					}
					showInfo();

					//					pushChatDiary = pushChatRest.getPushChatDiary();
					////					processMerchantStoreInfoData();	// 화면에 뿌려준다.	

				}
				hidePb();
				isUpdating = 0;
			}else{
				Log.d(TAG,"already updating..");
			}
			return null; 
		}
	}



	/**
	 * 러너블. 일기 추천 전 중복 검사	
	 */
	class RunnableSelectDuplicationRecommendation implements Runnable {
		public void run(){
			new backgroundSelectDuplicationRecommendation().execute();
		}
	}
	/**
	 * 비동기로 일기 추천 전 중복 검사
	 * backgroundSelectDuplicationRecommendation
	 */
	public class backgroundSelectDuplicationRecommendation extends  AsyncTask<Void, Void, Void> { 
		@Override protected void onPostExecute(Void result) {  
		} 
		@Override protected void onPreExecute() {  
		} 
		@Override protected Void doInBackground(Void... params) {  
			Log.d(TAG,"backgroundSelectDuplicationRecommendation");

			if(isUpdating==0){
				isUpdating = 1;
				// 파리미터 세팅
				PushChatRecommendation pushChatRecommendationParam = new PushChatRecommendation();
				pushChatRecommendationParam.setMemberId(userId);
				pushChatRecommendationParam.setPushChatDiaryIdPushChatDiary(idPushChatDiary);

				// 호출
				showPb();
				String callResult = pushChatRest.RestSelectDuplicationRecommendation(pushChatRecommendationParam);		 
				hidePb();
				// 결과 처리
				if(callResult.equals("0")){			// 0 / n / F
					// 추천 가능 - 추천 진행
					handler.sendEmptyMessage(REGISTER_RECOMMENDATION);
				}else if(callResult.equals("F")){	// 에러														 
					showMSG();
				}else{		// 1  : 이미 추천
					showAlert(getString(R.string.already_like));
				}
				isUpdating = 0;
			}else{
				Log.d(TAG,"already updating..");
			}
			return null; 
		}
	}


	/**
	 * 러너블.  일기 추천
	 */
	class RunnableRegisterRecommendation implements Runnable {
		public void run(){
			new backgroundRegisterRecommendation().execute();
		}
	}
	/**
	 * backgroundRegisterRecommendation
	 *  비동기로 일기 추천	
	 *
	 * @param
	 * @param
	 * @return
	 */
	public class backgroundRegisterRecommendation extends   AsyncTask<Void, Void, Void> {
		@Override protected void onPostExecute(Void result) { 
		}
		@Override protected void onPreExecute() { 
		}
		@Override protected Void doInBackground(Void... params) { 
			Log. d(TAG,"backgroundRegisterRecommendation");

			//			// 파리미터 세팅
			PushChatRecommendation pushChatRecommendationParam = new PushChatRecommendation();
			pushChatRecommendationParam.setMemberId(userId);					// 추천자(내) 아이디
			pushChatRecommendationParam.setEvaluation("");				// 평가 점수
			pushChatRecommendationParam.setContent("");					// 추천 내용
			pushChatRecommendationParam.setPushChatDiaryIdPushChatDiary(idPushChatDiary);		// 일기 고유 번호
			pushChatRecommendationParam.setPushChatDiaryMemberId(writerId);						// 작성자 아이디

			Log.d(TAG,"userId:"+userId);
			Log.d(TAG,"idPushChatDiary:"+idPushChatDiary);
			Log.d(TAG,"writerId:"+writerId);

			// 호출
			showPb();
			String callResult = pushChatRest.RestRegisterRecommendation(pushChatRecommendationParam);		
			//			// 결과 처리		 
			if(callResult.equals("SUCCESS")){ // 추천 성공 	 
				showAlert(getString(R.string.like_success));
				handler.sendEmptyMessage(SELECT_DIARY_INFORMATION);	// 화면 갱신
			}else{
				showMSG();
			}
			hidePb();
			return null ;
		}
	}
	/**
	 * 러너블.  사용자 차단
	 */
	class RunnableRegisterBlock implements Runnable {
		public void run(){
			new backgroundRunnableRegisterBlock().execute();
		}
	}
	/**
	 * backgroundRunnableRegisterBlock
	 *  비동기로 사용자 차단	
	 *
	 * @param
	 * @param
	 * @return
	 */
	public class backgroundRunnableRegisterBlock extends   AsyncTask<Void, Void, Void> {
		@Override protected void onPostExecute(Void result) { 
			hidePb();
		}
		@Override protected void onPreExecute() { 
			showPb();
		}
		@Override protected Void doInBackground(Void... params) { 
			Log. d(TAG,"backgroundRunnableRegisterBlock");
			
			PushChatBlock pushChatBlockParam = new PushChatBlock();
			pushChatBlockParam.setMemberId(writerId);					// 상대방 아이디
			pushChatBlockParam.setReporter(userId);						// 신고자 (내) 아이디
			pushChatBlockParam.setReason("");
			pushChatBlockParam.setIdChat("");
			pushChatBlockParam.setIdPushChatDiary(idPushChatDiary);		// 일기 고유 번호
			Log.d(TAG,"userId:"+userId);
			Log.d(TAG,"idPushChatDiary:"+idPushChatDiary);
			Log.d(TAG,"writerId:"+writerId);
			// 호출
			String callResult = pushChatRest.RestRegisterBlock(pushChatBlockParam);		
			//			// 결과 처리		 
			if(callResult.equals("SUCCESS")){ // 차단 성공 	 
				showAlert(getString(R.string.block_success));
//				showAlert(getString(R.string.like_success));
//				handler.sendEmptyMessage(SELECT_DIARY_INFORMATION);	// 화면 갱신
			}else if(callResult.equals("D")){
				showAlert(getString(R.string.already_block));
			}else{
				showMSG();
			}
			return null ;
		}
	}


	/////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 가맹점 이미지 URL 에서 이미지 받아와서 도메인에 저장하는 부분.
	/**
	 * LoadImage
	 *  이미지 URL 에서 이미지 받아온 스트림을 비트맵으로 저장한다
	 *
	 * @param $imagePath
	 * @param
	 * @return bm
	 */
	private Bitmap LoadImage( String $imagePath ) {
		InputStream inputStream = OpenHttpConnection( $imagePath ) ;
		Bitmap bm = BitmapFactory.decodeStream( inputStream ) ;
		return bm;
	}
	/**
	 * OpenHttpConnection
	 *  이미지 URL 에서 이미지 받아와서 스트림으로 저장한다
	 *
	 * @param $imagePath
	 * @param
	 * @return stream
	 */
	private InputStream OpenHttpConnection(String $imagePath) {
		// TODO Auto-generated method stub
		InputStream stream = null ;
		try {
			URL url = new URL( $imagePath ) ;
			HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection() ;
			urlConnection.setRequestMethod( "GET" ) ;
			urlConnection.connect() ;
			if( urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK ) {
				stream = urlConnection.getInputStream() ;
			}
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			Log.w(TAG,"MalformedURLException");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			Log.w(TAG,"IOException");
		}
		return stream ;
	}


	/*
	 * Bitmap 이미지 리사이즈 -- xml 자체 설정으로 대체
	 * Src : 원본 Bitmap
	 * newHeight : 새로운 높이
	 * newWidth : 새로운 넓이
	 * 참고 소스 : http://skyswim42.egloos.com/3477279 ( webview 에서 capture 화면 resizing 하는 source 도 있음 )
	 */
	private BitmapDrawable BitmapResizePrc(Bitmap Src, float newHeight, float newWidth)
	{
		BitmapDrawable Result = null;
		int width = Src.getWidth();
		int height = Src.getHeight();

		// calculate the scale - in this case = 0.4f
		float scaleWidth = ((float) newWidth) / width;
		float scaleHeight = ((float) newHeight) / height;

		// createa matrix for the manipulation
		Matrix matrix = new Matrix();

		// resize the bit map
		matrix.postScale(scaleWidth, scaleHeight);

		// rotate the Bitmap 회전 시키려면 주석 해제!
		//matrix.postRotate(45);

		// recreate the new Bitmap
		Bitmap resizedBitmap = Bitmap.createBitmap(Src, 0, 0, width, height, matrix, true);

		// check
		width = resizedBitmap.getWidth();
		height = resizedBitmap.getHeight();
		//		Log.i("ImageResize", "Image Resize Result : " + Boolean.toString((newHeight==height)&&(newWidth==width)) );

		// make a Drawable from Bitmap to allow to set the BitMap
		// to the ImageView, ImageButton or what ever
		Result = new BitmapDrawable(resizedBitmap);
		return Result;
	}


	///////////////////////////////////////////////////////////////////////////////////////////////////
	// 기타 기능


	//	// 전화 걸기
	//	/**
	//	 * setCallingPhoneNumber
	//	 *  전화를 건다
	//	 *
	//	 * @param phoneNumber
	//	 * @param
	//	 * @return
	//	 */
	//	public void setCallingPhoneNumber(final String phoneNumber) {
	//		handler.post(new Runnable() {
	//			public void run() {
	//				// TODO Auto-generated method stub
	//				Log.d(TAG, "Received phoneNumber: " + phoneNumber);
	//				if(("").equals(phoneNumber)) {
	//					Toast.makeText(DiaryDetailActivity.this, R.string.no_phone_num, Toast.LENGTH_SHORT).show();
	//				} else {
	//					Log.d(TAG, "Calling Phone.");
	//					confirmToCall(phoneNumber);
	//					
	////					startActivity(new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + phoneNumber)));							// 다이얼
	////					startActivity(new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + phoneNumber)));		// 통화
	//				}
	//			}
	//		});
	//	}


	////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 유틸

	/**
	 * confirmLikeUpDiary
	 *  일기 추천 확인받기
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void confirmLikeUpDiary(){			 
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();				
						Bundle b = new Bundle();
						b.putInt("confirmLikeUpDiary", 1);
						b.putString("msg", getString(R.string.like_confirm));
						message.setData(b);
						handler.sendMessage(message);
					}
				}
		).start();
	} 
	/**
	 * confirmBlock
	 *  사용자 차단 확인받기
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void confirmBlock(){			 
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();				
						Bundle b = new Bundle();
						b.putInt("confirmBlock", 1);
						b.putString("msg", getString(R.string.block_confirm));
						message.setData(b);
						handler.sendMessage(message);
					}
				}
		).start();
	} 
	/**
	 * updateFriendBtn
	 *  친구 여부에 따라 보여지는 버튼 다르게. 
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void updateFriendBtn(){			 
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();				
						Bundle b = new Bundle();
						b.putInt("updateFriendBtn", 1);
						message.setData(b);
						handler.sendMessage(message);
					}
				}
		).start();
	} 



	/**
	 * returnThis
	 *  컨택스트를 리턴한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public Context returnThis(){
		return this;
	}
	/**
	 * showMSG
	 *  화면에 error 토스트 띄운다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showMSG(){			// 화면에 error 토스트 띄움..
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();				
						Bundle b = new Bundle();
						b.putInt("showErrToast", 1);
						message.setData(b);
						handler.sendMessage(message);
					}
				}
		).start();
	} 

	/**
	 * showAlert
	 * 얼럿창을 띄운다
	 *
	 * @param msg
	 * @param 
	 * @return 
	 */
	public void showAlert(final String msg){
		DiaryDetailActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();				
				Bundle b = new Bundle();
				b.putInt("showAlert", 1);
				b.putString("msg", msg);			// 화면에 보여줄 메시지
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	}

	//	/**
	//	 * confirmToCall
	//	 *  전화걸지 확인받기
	//	 *
	//	 * @param msg
	//	 * @param 
	//	 * @return 
	//	 */
	//	public void confirmToCall(final String msg){
	//		DiaryDetailActivity.this.runOnUiThread(new Runnable(){		 
	//			@Override
	//			public void run(){
	//				Message message = handler.obtainMessage();				
	//				Bundle b = new Bundle();
	//				b.putInt("confirmToCall", 1);
	//				b.putString("msg", msg);			// 화면에 보여줄 메시지
	//				message.setData(b);
	//				handler.sendMessage(message);
	//			}
	//		});
	//	}


	// 중앙 프로그래스바 보임, 숨김
	/**
	 * showPb
	 *  중앙 프로그래스바 가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showPb(){
		new Thread( 
				new Runnable(){
					public void run(){
						Message message = handler .obtainMessage();
						Bundle b = new Bundle();
						b.putInt( "order" , 1);
						message.setData(b);
						handler .sendMessage(message);
					}
				}
		).start();
	}
	/**
	 * hidePb
	 *  중앙 프로그래스바 비가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void hidePb(){
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler .obtainMessage();
						Bundle b = new Bundle();
						b.putInt( "order" , 2);
						message.setData(b);
						handler .sendMessage(message);
					}
				}
		).start();
	}

	// 화면에 보여준다..
	/**
	 * showInfo
	 *  받아온 정보를 화면에 보여준다.
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showInfo(){
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();
						Bundle b = new Bundle();
						b.putInt("showYN", 1);
						message.setData(b);
						handler.sendMessage(message);
					}
				}
		).start();
	}
	///////////////////////////////////////////////////////////////////////////////////////////////////////
}